La motivación de este trabajo es la elaboración de un modelo predictivo que permita estimar, con la mayor precisión posible, los salarios anuales de jugadores de la NBA. Para ello, se utiliza un dataset con distitnas variables relativas a una serie de jugadores de la NBA, y siguiendo las etapas típicas de un proyecto de predicción, se intenta implementar el mejor modelo predictivo.
Las fases de la investigación son las estudiadas en clase y se asemejan al siguiente diagrama:
En primer lugar, se realiza un análisis exploratorio de los datos, en este caso poniendo primro el foco en las variables cuantitativas, y más tarde en las categóricas.
Después, en la fase de ingeniería de variables, se modifican algunas de las variables existentes con el fin de transformar los datos disponibles y hacer que encajen mejor en los modelos.
Posteriormente, se plantean una serie de modelos, basados en parte en el análisis exploratorio así como en algoritmos de selección de variables.
Tras el planteamiento de los primeros modelos, se pasa a evaluar la precision de éstos, y se elige aquel que tenga mejor capacidad predictiva. Ese mismo modelo se evalúa de nuevo, y se plantea nuevamente ingeniería de variables con el objetivo de tratar de refinar el modelo, y mejorar la predicción.
Finalmente, se evalua el modelo final sobre una muestra de los datos y se valoran sus métricas.
Es importante recordar que para que los modelos funcionen correctamente, es necesario verificar que se cumplen una serie de supuestos, tales como:
Normalidad
Homocedasticidad
Ausencia de multicolinealidad
Linealidad
No obstante, estas comprobaciones son propias de modelos descriptivos, y el caso que ocupa a este trabajo es el desarrollo de un modelo predictivo. Por esta razón, no se llevan a cabo este tipo de contrastes, ni se pone el foco en la capacidad explicativa del modelo, sino que se valoran sus capacidades predictivas.
A continuación se incluye la descripción de cada una de las variables del dataset, utilizando la materia de clase y el apartado de estadísticas de la página web de la NBA.
library(dplyr)
library(broom)
library(ggcorrplot)
library(Hmisc)
library(car)
library(plotly)
Como ya se ha comentado, la primera parte consiste en un análisis exploratorio de los datos.
# Importacion de los datos
nba <- read.csv("./data/nba.csv")
# Dimensiones del dataframe
dim(nba) # 458 observaciones, 28 variables
## [1] 485 28
glimpse(nba) # vistazo rapido a las variables
## Rows: 485
## Columns: 28
## $ Player <chr> "Zhou Qi", "Zaza Pachulia", "Zach Randolph", "Zach ...
## $ Salary <int> 815615, 3477600, 12307692, 3202217, 3057240, 131261...
## $ NBA_Country <chr> "China", "Georgia", "USA", "USA", "USA", "USA", "US...
## $ NBA_DraftNumber <int> 43, 42, 19, 13, 10, 62, 62, 62, 23, 35, 62, 6, 40, ...
## $ Age <int> 22, 33, 36, 22, 20, 24, 30, 23, 30, 23, 27, 24, 27,...
## $ Tm <chr> "HOU", "GSW", "SAC", "CHI", "POR", "DAL", "BOS", "M...
## $ G <int> 16, 66, 59, 24, 62, 79, 2, 5, 70, 45, 42, 70, 77, 6...
## $ MP <int> 87, 937, 1508, 656, 979, 2238, 7, 118, 2200, 430, 4...
## $ PER <dbl> 0.6, 16.8, 17.3, 14.6, 8.2, 11.5, -4.9, 0.9, 11.1, ...
## $ TS. <dbl> 0.303, 0.608, 0.529, 0.499, 0.487, 0.543, 0.000, 0....
## $ X3PAr <dbl> 0.593, 0.004, 0.193, 0.346, 0.387, 0.489, 0.667, 0....
## $ FTr <dbl> 0.370, 0.337, 0.140, 0.301, 0.146, 0.141, 0.000, 0....
## $ ORB. <dbl> 6.5, 11.0, 7.0, 1.4, 4.9, 1.3, 15.9, 0.0, 5.0, 13.6...
## $ DRB. <dbl> 16.8, 25.0, 23.8, 14.4, 18.3, 11.3, 15.4, 5.0, 14.0...
## $ TRB. <dbl> 11.7, 18.5, 15.0, 7.7, 11.7, 6.1, 15.7, 2.5, 9.5, 1...
## $ AST. <dbl> 1.5, 15.4, 14.9, 18.6, 7.3, 13.3, 0.0, 23.2, 9.7, 1...
## $ STL. <dbl> 1.1, 1.9, 1.4, 1.8, 0.8, 1.4, 7.2, 2.6, 0.9, 1.8, 1...
## $ BLK. <dbl> 6.8, 1.3, 0.6, 0.5, 2.5, 0.3, 0.0, 2.4, 1.4, 2.8, 4...
## $ TOV. <dbl> 18.2, 19.3, 12.5, 9.7, 15.6, 9.1, 0.0, 19.3, 12.0, ...
## $ USG. <dbl> 19.5, 17.2, 27.6, 29.5, 15.5, 17.0, 19.2, 21.7, 14....
## $ OWS <dbl> -0.4, 1.7, 0.3, -0.1, -0.4, 1.6, -0.1, -0.5, 2.0, 0...
## $ DWS <dbl> 0.1, 1.4, 1.1, 0.5, 1.2, 1.6, 0.0, 0.1, 1.0, 0.6, 0...
## $ WS <dbl> -0.2, 3.1, 1.4, 0.4, 0.8, 3.1, 0.0, -0.4, 3.1, 1.4,...
## $ WS.48 <dbl> -0.121, 0.160, 0.046, 0.027, 0.038, 0.067, -0.251, ...
## $ OBPM <dbl> -10.6, -0.6, -0.6, -0.7, -3.7, -0.4, -12.6, -8.7, -...
## $ DBPM <dbl> 0.5, 1.3, -1.3, -2.0, 0.9, -0.5, -0.7, -1.9, -0.6, ...
## $ BPM <dbl> -10.1, 0.8, -1.9, -2.6, -2.9, -0.9, -13.3, -10.6, -...
## $ VORP <dbl> -0.2, 0.7, 0.0, -0.1, -0.2, 0.6, 0.0, -0.3, 0.5, 0....
El dataset consta de 458 observaciones, con 28 variables de distinto formato. Tres de las variables son categóricas, algo a tener en cuenta si se quieren utilizar para las predicciones, y el resto de variables son numéricas. Antes de continuar, se evalúa la presencia de valores no disponibles, algo que puede entorpecer el resto de procesos. También se comprueba la ausencia de valores duplicados, pese a que el enunciado indica que ya se han elimiando, solo para comrpobar que no ha habido problemas en la carga de los datos.
sum(duplicated(nba)) # no hay valores duplicados
## [1] 0
# Comprobacion de NA's
sum(is.na(nba)) # 8 na en todo el dataset.
## [1] 8
nba[rowSums(is.na(nba)) > 0, ]
## Player Salary NBA_Country NBA_DraftNumber Age Tm G MP PER TS.
## 30 Tyler Lydon 1579440 USA 24 21 DEN 1 2 0 NA
## 38 Trey McKinney-Jones 46080 USA 62 27 IND 1 1 0 NA
## X3PAr FTr ORB. DRB. TRB. AST. STL. BLK. TOV. USG. OWS DWS WS WS.48 OBPM
## 30 NA NA 0 0 0 0 0 0 NA 0 0 0 0 -0.016 -5.6
## 38 NA NA 0 0 0 0 0 0 NA 0 0 0 0 -0.001 -5.7
## DBPM BPM VORP
## 30 -0.9 -6.5 0
## 38 -0.1 -5.9 0
# aplicando la fila de sumas al resultado de is.na(nba) y filtrando por mayor a 0, se obtienen las filas que tienen NA.
# Son la 30 y la 38, Tyler Lydon y Trey McKinney-Jones, los elimino
nba <- nba[-c(30, 38),]
Se encuentran un total de 8 valores no disponibles, correspondientes a las observaciones de Tyler Lydon y Trey McKinney-Jones. Dada la cantidad de datos disponibles, se opta por la eliminación de estas dos observaciones, puesto que el efecto de su ausencia no tiene repercusión notable.
Se examinan las correlaciones de las variables cuantitativas, con el fin de tener una primera idea de qué puede influir en el salario de los jugadores. No obstante, es necesario recordar que correlación no implica causalidad.
nbaNumericas <- nba %>%
select(-c(1, 3, 6)) # creo un nuevo dataframe que cotniene solo
# las variables numéricas
rh <- rcorr(as.matrix(nbaNumericas), # solo las cuantitativas
type = "pearson")
# Correlograma
ggcorrplot(rh$r, method = 'square', type = 'lower') +
# Títulos y aspectos visuales
ggtitle("Correlograma") +
theme_bw() +
theme_minimal() +
xlab(NULL) + ylab(NULL) +
theme(axis.text.x = element_text(angle = 90)) # rotacion del
# texto del eje x para facilitar su lectura
No hay variables que estén fuertemente correlacionadas con el salario. No obstante, para el primer modelo se incluirán aquellas que tienen más de un 0.25 de correlación, positiva o negativa. Estas variables son el número del draft, Win Share (WS), el valor de reemplazo (VORP), los minutos jugados (MP) y la edad del jugador (Age). Se excluye la salida de la matriz, porque es una matriz de dimensiones 25 x 25. No obstante, se puede acceder a los datos con rh$r.
Se puede apreciar que existen distintas variables que presentan alta correlacion entre ellas. Este fenómeno se da en aquellas que están relacionadas, como por ejemplo el porcentaje de rebotes ofensivos, defensivos y totales. A continuación se muestra un correlograma que incluye exclusivamente estas variables.
correlacionesFuertes <- nbaNumericas %>%
select(ORB., DRB., TRB., DWS, OWS, WS,
PER, WS.48, OBPM, BPM, VORP) # selecciono las variables del
# dataset
# Calculo las correlaciones
rhFuertes <- rcorr(as.matrix(correlacionesFuertes,
type = "pearson"))
# Correlograma
ggcorrplot(rhFuertes$r,
method = 'square',
type = 'lower',
lab = TRUE) + # añade los valores numéricos
# Titulos y aspectos visuales
ggtitle("Correlaciones fuertes") +
theme_bw() +
theme_minimal() +
xlab(NULL) + ylab(NULL) +
theme(axis.text.x = element_text(angle = 90)) # rotación del
# texto del eje x para facilitar su lectura
A continuación se representan gráficamente todas las variables numéricas en forma de gráfico de dispersión, manteniendo el salario siempre en el eje Y. La ejecución se lleva a cabo con un bucle, para acortar el código
# Grafico de todas las correlaciones, una a una con el salario
for (var in names(nbaNumericas)) {
# para cada variable del dataset...
# se crea el objeto "plot" con el gráfico de dispersión
# correspondiente
plot <- ggplot(nbaNumericas,
aes(x = nbaNumericas[, var], # el eje varía
y = Salary)) + # el eje y es fijo
geom_point(color = "aquamarine3") +
# Tema y etiquetas
labs(x = var,
y = "Salario anual") +
theme_minimal()
print(plot) # importante, sin el el loop no genera output.
}
De todas las visualizaciones anteriores, se puede concluir que en todos los casos existe una gran dispersión. En principio, no parece haber grupos diferenciados en cada variable, y para mismos niveles de cada variable, el salario varía mucho. No obstante, la variable que mayor relación parece presentar con el salario es el número del draft. Se aprecia una tendencia negativa, a medida que el número del draft aumenta, el salario anual se reduce. No obstante, para esta variable también existe mucha dispersión en términos de salario para cada variable.
De manera similar a las visualizaciones de los gráficos de dispersión, se trabaja con un bucle y se representan las funciones de densidad de todas las variables.
for (var in names(nbaNumericas)) {
plot <- ggplot(nbaNumericas, aes(x = nbaNumericas[, var])) +
# Gráfico de densidad
geom_density(fill = "aquamarine3", alpha = 0.5 ) +
# Tema, título y etiquetas
labs(title = var,
x = var) +
theme_minimal()
print(plot)
}
# Muchas de ellas estan concetnradas en torno a una media, no hay
# mucha dispersion.
La mayoría de variables presenta una distribución estrecha, con poca varianza. Sin embargo, variables como el número del draft o los minutos jugados parecen agruparse en torno a dos puntos diferenciados. Puede ser interesante estudiar estas características y decidir si es conveniente hacer agrupaciones para variables, especialmente para el grupo de draft.
Se excluye del análisis a la variable de nombre del jugador, porque es coherente pensar que no es útil a la hora de determinar el salario.
El siguiente gráfico muestra el salario medio por equipos
ggplot(nba,
aes(x = Tm, y = mean(Salary)),
) +
geom_col(fill = "aquamarine3") + # media en verde
geom_col(aes(y = median(Salary)), # mediana en azul
fill = "lightblue") +
coord_flip() +
theme_minimal() +
labs(title = "Salario medio y mediano por equipos",
x = "Equipo",
y = "Salario medio y mediano")
Tal como se puede observar, el salario medio por equipos es bastante similar. El único valor que destaca claramente es el de “TOT”, que hace referencia a jugadores que en la misma temporada han cambiado de equipo. En color azul se representa la mediana, puesto que es robusta a valores extremos. El valor es igualmente similar por equipos.
nba %>% filter(Tm == "TOT") %>% arrange(desc(Salary))
## Player Salary NBA_Country NBA_DraftNumber Age Tm G MP
## 1 Blake Griffin 29512900 USA 1 28 TOT 58 1970
## 2 George Hill 20000000 USA 26 31 TOT 65 1783
## 3 Greg Monroe 17884176 USA 7 27 TOT 47 951
## 4 Tobias Harris 16000000 USA 19 25 TOT 76 2546
## 5 Dwyane Wade 15550000 USA 5 36 TOT 64 1476
## 6 Eric Bledsoe 14500000 USA 18 28 TOT 70 2209
## 7 Nikola Mirotic 12500000 Montenegro 23 26 TOT 51 1352
## 8 Jordan Clarkson 11562500 USA 46 25 TOT 77 1819
## 9 Joe Johnson 9505000 USA 10 36 TOT 51 1129
## 10 Trevor Booker 9125000 USA 23 30 TOT 64 1085
## 11 Avery Bradley 8808989 USA 19 27 TOT 46 1433
## 12 Corey Brewer 7579366 USA 7 31 TOT 69 1121
## 13 Channing Frye 7420912 USA 8 34 TOT 50 643
## 14 Boban Marjanovic 7000000 Serbia 62 29 TOT 35 286
## 15 Jae Crowder 6796117 USA 34 27 TOT 76 2007
## 16 Marco Belinelli 6306060 Italy 18 31 TOT 76 1838
## 17 Isaiah Thomas 6261395 USA 60 28 TOT 32 862
## 18 Ersan Ilyasova 6000000 Turkey 36 30 TOT 65 1627
## 19 Brandan Wright 5179760 USA 8 30 TOT 28 381
## 20 Jahlil Okafor 4995120 USA 3 22 TOT 28 353
## 21 Jameer Nelson 4736050 USA 20 35 TOT 50 1013
## 22 Devin Harris 4402546 USA 5 34 TOT 67 1272
## 23 Nik Stauskas 3807146 Canada 8 24 TOT 37 459
## 24 Noah Vonleh 3505233 USA 9 22 TOT 54 875
## 25 Emmanuel Mudiay 3381480 Democratic Re... 7 21 TOT 63 1237
## 26 Elfrid Payton 3332340 USA 10 23 TOT 63 1808
## 27 Doug McDermott 3294994 USA 11 26 TOT 79 1724
## 28 James Ennis 3028410 USA 50 27 TOT 68 1540
## 29 Bruno Caboclo 2451225 Brazil 20 22 TOT 11 99
## 30 Rodney Hood 2386864 USA 23 25 TOT 58 1576
## 31 Ramon Sessions 2328652 USA 56 31 TOT 27 391
## 32 Dante Cunningham 2300000 USA 33 30 TOT 70 1499
## 33 Derrick Rose 2116955 USA 1 29 TOT 21 366
## 34 Luke Babbitt 1974159 USA 16 28 TOT 49 708
## 35 Rashad Vaughn 1889040 USA 17 21 TOT 28 212
## 36 Tyler Zeller 1709538 USA 17 28 TOT 62 1025
## 37 Willie Reed 1577230 USA 62 27 TOT 42 428
## 38 Shabazz Muhammad 1577230 USA 14 25 TOT 41 385
## 39 DeAndre Liggins 1577230 USA 53 29 TOT 55 711
## 40 Sean Kilpatrick 1524305 USA 62 28 TOT 48 537
## 41 Malachi Richardson 1504560 USA 22 22 TOT 26 324
## 42 Troy Williams 1471382 USA 62 23 TOT 21 307
## 43 Larry Nance 1471382 USA 27 25 TOT 62 1367
## 44 Willy Hernangomez 1435750 Spain 35 23 TOT 45 430
## 45 Brice Johnson 1331160 USA 25 23 TOT 18 98
## 46 Kay Felder 1312611 USA 54 22 TOT 15 137
## 47 Derrick Jones 1312611 USA 62 20 TOT 19 245
## 48 Isaiah Canaan 1069308 USA 34 26 TOT 20 422
## 49 Larry Drew 148318 USA 62 27 TOT 10 70
## 50 Nigel Hayes 92160 USA 62 23 TOT 6 60
## 51 Antonius Cleveland 92160 USA 62 23 TOT 14 93
## 52 Mike James 87552 USA 62 27 TOT 36 687
## 53 Jarell Eddie 83129 USA 62 26 TOT 3 9
## 54 Briante Weber 83129 USA 62 25 TOT 18 237
## 55 Gary Payton 50000 USA 62 25 TOT 19 149
## PER TS. X3PAr FTr ORB. DRB. TRB. AST. STL. BLK. TOV. USG. OWS DWS WS
## 1 19.6 0.544 0.323 0.331 4.1 19.8 11.9 28.1 1.0 0.8 12.6 28.9 3.2 1.9 5.0
## 2 13.2 0.581 0.399 0.273 2.6 8.9 5.7 14.9 1.6 1.3 13.2 16.4 2.3 0.8 3.1
## 3 20.2 0.586 0.000 0.303 11.8 25.2 18.4 16.8 2.0 1.7 17.9 22.4 1.3 1.4 2.7
## 4 17.4 0.569 0.369 0.178 2.4 15.6 8.9 11.6 1.3 1.1 7.2 23.2 4.3 2.5 6.7
## 5 15.5 0.506 0.163 0.281 3.8 14.7 9.3 23.7 1.9 2.6 15.5 26.1 -0.2 1.5 1.4
## 6 19.3 0.577 0.364 0.318 2.6 11.5 7.1 24.9 3.2 1.5 16.1 26.3 2.6 2.3 4.9
## 7 17.8 0.567 0.525 0.210 4.1 24.0 14.1 8.7 1.4 2.2 8.0 23.2 1.6 1.5 3.2
## 8 16.7 0.543 0.337 0.202 3.3 9.2 6.3 19.4 1.5 0.3 10.8 26.6 1.9 1.1 3.1
## 9 8.4 0.494 0.404 0.124 1.4 14.7 8.1 10.2 0.8 0.5 11.6 16.0 -0.2 1.2 0.9
## 10 14.8 0.563 0.089 0.275 10.8 18.7 14.8 11.0 1.2 1.5 14.1 16.5 1.5 1.2 2.7
## 11 9.7 0.496 0.325 0.131 1.7 7.3 4.5 10.4 1.8 0.5 13.3 23.5 -1.4 1.3 -0.1
## 12 11.1 0.535 0.331 0.297 3.7 10.3 7.0 7.7 3.2 1.1 12.8 14.3 0.6 1.5 2.1
## 13 14.2 0.626 0.544 0.078 1.9 19.8 11.0 7.5 1.3 1.8 7.8 14.9 1.0 0.5 1.6
## 14 25.1 0.611 0.000 0.621 13.9 29.8 21.7 12.5 1.5 3.3 16.0 28.8 0.8 0.5 1.2
## 15 10.3 0.531 0.506 0.226 3.1 11.4 7.3 6.9 1.5 0.8 9.5 16.9 1.0 1.5 2.5
## 16 14.0 0.581 0.508 0.216 1.1 7.1 4.1 11.9 1.6 0.4 10.1 20.3 2.2 1.2 3.4
## 17 12.6 0.508 0.447 0.311 2.2 6.3 4.2 27.0 0.8 0.3 16.6 28.8 -0.1 0.3 0.2
## 18 14.5 0.555 0.414 0.216 7.6 17.5 12.6 7.6 1.7 1.2 9.7 18.4 1.9 1.7 3.6
## 19 19.0 0.596 0.000 0.324 9.8 19.3 14.4 5.6 1.7 6.4 6.4 14.7 0.8 0.5 1.3
## 20 15.4 0.584 0.029 0.210 6.3 19.4 12.8 5.9 0.4 3.9 12.2 21.0 0.3 0.3 0.6
## 21 8.2 0.489 0.508 0.082 1.4 9.5 5.6 23.0 1.3 0.3 21.0 13.7 -0.1 0.6 0.6
## 22 12.8 0.561 0.493 0.384 1.0 9.8 5.3 16.7 1.8 0.8 13.0 20.1 1.4 0.9 2.3
## 23 9.1 0.554 0.669 0.165 0.7 12.6 6.6 10.1 0.8 0.5 13.4 15.5 0.1 0.2 0.3
## 24 12.8 0.509 0.282 0.248 8.6 30.1 19.2 5.7 1.1 1.6 10.7 14.5 0.5 1.2 1.7
## 25 11.6 0.476 0.281 0.246 2.4 11.3 6.8 24.6 1.6 0.8 16.2 24.4 -0.7 0.7 0.0
## 26 16.6 0.538 0.138 0.252 3.8 12.8 8.3 34.9 2.2 1.0 18.5 21.8 1.4 1.4 2.9
## 27 10.5 0.579 0.420 0.164 2.6 10.2 6.3 6.6 0.5 0.8 9.4 15.0 1.7 0.6 2.3
## 28 11.8 0.592 0.391 0.314 5.3 11.1 8.1 6.7 1.5 1.1 11.6 13.6 2.0 1.1 3.1
## 29 8.5 0.398 0.567 0.200 7.7 15.6 11.5 6.9 1.5 3.8 10.9 16.6 -0.1 0.1 0.0
## 30 14.4 0.545 0.447 0.162 1.6 9.8 5.8 9.7 1.4 0.6 8.1 24.6 1.1 1.4 2.5
## 31 10.8 0.473 0.224 0.483 1.7 9.1 5.5 26.5 1.8 0.4 17.6 19.2 0.0 0.3 0.3
## 32 9.7 0.542 0.474 0.149 5.1 14.5 9.9 4.1 1.2 1.4 8.1 11.5 1.0 1.2 2.2
## 33 12.3 0.515 0.164 0.267 4.0 6.0 5.1 14.6 0.7 0.9 14.8 26.2 -0.1 0.0 -0.1
## 34 10.2 0.587 0.720 0.104 1.1 14.1 7.6 6.6 0.6 0.8 7.9 14.9 0.6 0.4 1.0
## 35 9.3 0.546 0.661 0.107 1.6 9.9 5.8 8.7 1.2 1.2 9.3 13.8 0.1 0.1 0.2
## 36 15.9 0.585 0.088 0.241 11.0 19.6 15.2 6.8 0.7 2.5 11.3 17.0 1.7 0.8 2.5
## 37 19.2 0.671 0.017 0.455 9.1 21.7 15.5 3.6 1.0 4.3 11.6 16.6 1.0 0.5 1.6
## 38 14.4 0.500 0.147 0.229 6.0 14.0 10.0 6.4 1.2 0.7 3.1 22.3 0.3 0.2 0.5
## 39 6.2 0.485 0.520 0.049 1.2 10.8 6.1 8.1 2.6 1.7 16.1 7.8 -0.1 0.7 0.6
## 40 9.5 0.475 0.500 0.238 0.6 14.9 7.7 11.5 0.8 0.6 10.3 24.6 -0.5 0.3 -0.2
## 41 5.9 0.446 0.444 0.244 1.7 10.7 6.0 5.6 1.6 0.3 9.1 15.2 -0.2 0.1 -0.1
## 42 15.2 0.544 0.349 0.275 8.0 14.8 11.4 7.8 3.2 1.1 13.5 20.1 0.2 0.4 0.5
## 43 20.3 0.613 0.031 0.338 12.3 21.6 17.0 8.8 3.0 2.1 10.0 15.8 3.5 2.2 5.7
## 44 20.6 0.592 0.075 0.555 13.6 25.2 19.3 11.0 1.8 2.8 15.4 21.7 0.8 0.6 1.4
## 45 18.2 0.486 0.024 0.119 10.4 25.4 17.9 3.4 4.5 5.5 10.2 22.3 0.0 0.2 0.2
## 46 2.9 0.375 0.279 0.176 1.5 10.5 5.9 22.5 1.1 0.6 17.9 28.4 -0.6 0.1 -0.5
## 47 10.3 0.488 0.346 0.462 9.6 7.8 8.7 5.1 0.8 4.4 10.1 12.7 0.2 0.3 0.4
## 48 13.5 0.539 0.482 0.372 1.5 10.1 5.7 26.7 1.8 0.2 15.4 18.9 0.5 0.1 0.6
## 49 3.0 0.354 0.375 0.000 4.8 0.0 2.3 18.7 0.0 0.0 11.1 16.7 -0.1 0.0 -0.1
## 50 2.4 0.362 0.611 0.167 1.8 8.0 4.7 11.0 0.0 1.6 9.4 15.7 -0.2 0.0 -0.2
## 51 5.4 0.402 0.125 0.375 2.3 12.2 7.2 2.9 3.2 4.8 17.7 11.0 -0.2 0.1 0.0
## 52 13.9 0.469 0.305 0.262 2.0 12.2 7.0 29.5 2.0 0.8 12.0 25.1 -0.1 0.3 0.2
## 53 -1.9 0.000 1.000 0.000 0.0 12.0 6.1 0.0 5.6 0.0 0.0 9.8 0.0 0.0 0.0
## 54 10.1 0.527 0.256 0.233 3.8 13.1 8.4 13.1 3.8 1.9 24.0 11.7 0.0 0.4 0.4
## 55 7.6 0.414 0.319 0.064 6.1 11.7 8.9 12.4 1.0 1.7 5.8 15.3 0.0 0.1 0.1
## WS.48 OBPM DBPM BPM VORP
## 1 0.123 2.8 0.0 2.8 2.4
## 2 0.083 0.3 -1.0 -0.7 0.6
## 3 0.134 -0.5 1.9 1.3 0.8
## 4 0.127 1.7 -0.7 1.0 1.9
## 5 0.045 -2.1 0.5 -1.7 0.1
## 6 0.107 2.2 -0.4 1.8 2.1
## 7 0.113 0.9 -0.8 0.1 0.7
## 8 0.081 0.9 -2.6 -1.7 0.1
## 9 0.040 -3.3 -0.4 -3.7 -0.5
## 10 0.120 -1.1 0.6 -0.5 0.4
## 11 -0.005 -2.8 -1.3 -4.1 -0.8
## 12 0.089 -1.8 1.0 -0.8 0.3
## 13 0.118 -0.1 -0.9 -1.0 0.2
## 14 0.208 -0.5 0.6 0.1 0.2
## 15 0.060 -0.8 -1.0 -1.8 0.1
## 16 0.089 0.7 -2.2 -1.5 0.2
## 17 0.008 -0.9 -4.3 -5.2 -0.7
## 18 0.106 0.0 -0.2 -0.2 0.7
## 19 0.165 -1.3 2.3 1.0 0.3
## 20 0.083 -3.7 -0.7 -4.4 -0.2
## 21 0.027 -2.6 -1.5 -4.1 -0.5
## 22 0.087 -0.3 -1.6 -1.8 0.0
## 23 0.035 -2.0 -1.8 -3.9 -0.2
## 24 0.091 -3.4 0.3 -3.1 -0.2
## 25 0.000 -2.5 -2.2 -4.7 -0.8
## 26 0.076 0.1 0.0 0.1 1.0
## 27 0.064 -0.7 -1.7 -2.4 -0.2
## 28 0.096 -0.5 -0.4 -0.9 0.4
## 29 -0.012 -4.1 -0.2 -4.3 -0.1
## 30 0.077 0.2 -2.2 -2.1 0.0
## 31 0.031 -3.2 -2.0 -5.2 -0.3
## 32 0.071 -1.5 -0.1 -1.6 0.2
## 33 -0.010 -3.5 -4.0 -7.4 -0.5
## 34 0.067 -0.8 -2.1 -3.0 -0.2
## 35 0.050 -1.9 -2.9 -4.7 -0.1
## 36 0.119 -1.3 -0.5 -1.8 0.0
## 37 0.175 -0.8 0.0 -0.8 0.1
## 38 0.064 -2.0 -3.8 -5.8 -0.4
## 39 0.037 -3.2 1.2 -2.0 0.0
## 40 -0.020 -3.7 -3.8 -7.5 -0.7
## 41 -0.018 -4.3 -2.2 -6.5 -0.4
## 42 0.085 -0.1 0.1 0.0 0.2
## 43 0.200 1.2 2.4 3.6 1.9
## 44 0.156 -0.1 0.6 0.5 0.3
## 45 0.085 -4.9 2.2 -2.7 0.0
## 46 -0.185 -8.7 -3.5 -12.1 -0.3
## 47 0.081 -2.5 0.8 -1.7 0.0
## 48 0.072 0.1 -2.5 -2.4 0.0
## 49 -0.063 -5.4 -5.4 -10.7 -0.2
## 50 -0.134 -6.0 -4.1 -10.0 -0.1
## 51 -0.001 -7.5 3.8 -3.7 0.0
## 52 0.016 -0.8 -1.8 -2.7 -0.1
## 53 -0.141 -10.1 1.7 -8.4 0.0
## 54 0.072 -3.3 2.9 -0.4 0.1
## 55 0.021 -3.4 -1.7 -5.2 -0.1
Seria interesante construir una nueva variable, que contraste si el jugador ha jugado en varios equipos o no.
Visualizacion de los jugadores por su nacionalidad
ggplot(nba,
aes(x = NBA_Country),
) +
geom_bar(fill = "aquamarine3",
color = "black") +
coord_flip() +
theme_minimal() +
labs(title = "Nacionalidad de los jugadores",
y = "Nº de jugadores",
x = "Nacionalidad")
La inmnesa mayoria de los jugadores son de nacionalidad estadounidense. A continuacion una visualicación que excluye a USA, para ver bien los jugadores en el resto
nba %>%
filter(NBA_Country != "USA") %>% # el filtro para paises # distintos a usa
ggplot(aes(x = NBA_Country)) +
geom_bar(fill = "aquamarine3", color = "black") +
coord_flip() +
theme_minimal() +
labs(title = "Nacionalidad de los jugadores (excluida USA)",
y = "Nº de jugadores",
x = "Nacionalidad")
En base a las variables categóricas examinadas, en este apartado se plantean una serie de transformaciones y creaciones de variables, para extender el análisis de datos, y para incluirlas en el modelo si pudiese resultar interesante.
El gráfico de salario medio y mediano para cada equipo revela que la categoría “TOT”, la cual recoge a los jugadores que han jugadoen varios equipos en la misma temporada, tiene valores muy superiores al resto. Puesto que quizá sea interesante introducir una variable que recoja esta diferencia en el modelo, se procede a su creación, mediante “string encoding”
nba <- nba %>% mutate(
variosEquipos = case_when(Tm == "TOT" ~ "Varios equipos",
Tm != "TOT" ~ "Un solo equipo"
)
)
# Se crea la variable "variosEquipos" que tomará el valor
# "Varios equipos" si el jugador ha jugado en varios equipos,
# y "Un solo equipo en caso contrario"
# Paso a factor
nba$variosEquipos <- as.factor(nba$variosEquipos)
Una vez creada la variable, se procede a examinar el comportamiento del salario para cada grupo
ggplotly( # ggplotly transforma el gráfico en interactivo
ggplot(nba, aes(x = variosEquipos,
y = Salary,
fill = variosEquipos))+
geom_boxplot() +
labs(title = "Un equipo vs. varios",
x = NULL,
y = "Salario",
fill = NULL) + # titulo de la leyenda
theme_minimal() +
theme(axis.text.x = element_blank()) # quita las x ticks
)
Pese a lo constatado al analizar la categoría de varios equipos contra los equipos de manera individual, el grafico de caja y bigotes muestra que, al comparar ambos grupos, no existen grandes diferencias. El salario mediano es practicamente el mismo, aunque la distribucón es algo más pequeña en el grupo de varios equipos. Hay que tener en cuenta que este grupo tiene muchos menos individuos que el grupo de un solo equipo.
t.test(nba$Salary ~ nba$variosEquipos)
##
## Welch Two Sample t-test
##
## data: nba$Salary by nba$variosEquipos
## t = 1.8567, df = 78.544, p-value = 0.06711
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -117562.9 3375908.7
## sample estimates:
## mean in group Un solo equipo mean in group Varios equipos
## 6846139 5216966
El t-test, que establece como hipótesis nula la igualdad de media entre grupos, devuelve un p.valor que no permite rechazar la igualdad, aunque por poco. El salario medio de los dos grupos es estadísticamente igual.
No obstante, a continuación se crea una nueva variable “dummy” utilizando la técnica de “one hot encoding” con el fin de poder incluir esta variable en los modelos, para ver su efecto.
nba <- nba %>%
mutate(variosEquiposDummy = ifelse(Tm == "TOT", 1, 0))
# Toma el valor 1 si el jugador ha judado en mas de un equipo
Igual que para el caso del equipo, se crea una nueva variable que codifique si el jugador es estadounidense o no. El procedimiento es el mismo.
# Creacion de la nueva columna
nba <- nba %>% mutate(nacionalidad =
case_when(NBA_Country == "USA" ~ "USA",
NBA_Country != "USA"~ "NotUSA"))
# Conversión a factor
nba$nacionalidad <- as.factor(nba$nacionalidad)
ggplotly( # ggplotly transforma el gráfico en interactivo
ggplot(nba, aes(x = nacionalidad,
y = Salary,
fill = nacionalidad))+
geom_boxplot() +
labs(title = "Salarios de estadounidenses vs. no estadounidenses",
x = NULL,
y = "Salario",
fill = NULL) + # titulo de la leyenda
theme_minimal() +
theme(axis.text.x = element_blank()) # quita las x ticks
)
Igual que para el caso de los equipos, las distribuciones son casi iguales
t.test(nba$Salary ~ nba$nacionalidad)
##
## Welch Two Sample t-test
##
## data: nba$Salary by nba$nacionalidad
## t = 0.66206, df = 197.85, p-value = 0.5087
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -991257.5 1993217.6
## sample estimates:
## mean in group NotUSA mean in group USA
## 7046470 6545490
No se rechaza la igualdad de medias. Igualmente, se genera la variable “dummy” de cara a incluirla en los modelos.
nba <- nba %>%
mutate(nacionalidadDummy = ifelse(nacionalidad == "USA", 1, 0))
# Toma el valor 1 si el jugador es de USA
Inicialmente, se construyen los siguientes modelos:
Un modelo con las variables que resultaron más correlacionadas con el salario
modeloMasCorrelacionadas <- lm(
formula = Salary ~ NBA_DraftNumber + WS + VORP + MP + Age,
data = nba)
Un segundo modelo, que es el anterior pero con el numero del draft al cuadrado
modeloDraftCuadrado <- lm(
formula = Salary ~ I(NBA_DraftNumber^2) + WS + VORP + MP + Age,
data = nba)
Un terce modelo, que incluye interacciones entre el draft y la edad
modeloDraftEdad <- lm(
formula = Salary ~ NBA_DraftNumber:Age + WS + VORP + MP,
data = nba)
Finalmente, un cuarto modelo, que incluye las variables dummy creadas
modeloDummy <- lm(
formula = Salary ~ NBA_DraftNumber + Age + WS + VORP + MP +
nacionalidadDummy + variosEquiposDummy,
data = nba)
Antes de pasar a la selección de variables con el método stepwise, se comparan los modelos anteriores mediante el criterio de información de Akaike.
AIC(modeloMasCorrelacionadas,
modeloDraftCuadrado,
modeloDraftEdad,
modeloDummy)
## df AIC
## modeloMasCorrelacionadas 7 16340.62
## modeloDraftCuadrado 7 16348.53
## modeloDraftEdad 6 16425.26
## modeloDummy 9 16344.43
Utilizando el AIC, el mejor modelo es el primero. No obstante, antes de evaluarlo, se utiliza el método stepwise para ver cuales son las variables que minimizan el AIC del modelo
library(MASS) # no he cargado antes MASS porque la funcion
# select interfiere con la de dplyr, y asi no tengo que usar
# dplyr::select tantas veces
# Utilizo backward porque en el script utilicé backward, forward y
# mixto, y el de menor AIC fue el de backward.
nbaNumericas <- nba[, -c(1 , 3, 6, 29, 31)]
# Primero actualizo el dataset
# de variables numericas, de manera que contenga las nuevas dummy.
# El 29 y el 31 hacen referencia a las nuevas variables creadas
# con string encoding, tambien hay que excluirlas
modeloTotal <- lm(Salary ~., data = nbaNumericas) # defino un modelo # con todo
stepAIC(modeloTotal, direction = "backward") # ejecuto el stepwise
## Start: AIC=14948.01
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr +
## FTr + ORB. + DRB. + TRB. + AST. + STL. + BLK. + TOV. + USG. +
## OWS + DWS + WS + WS.48 + OBPM + DBPM + BPM + VORP + variosEquiposDummy +
## nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - TOV. 1 1.0877e+09 1.1914e+16 14946
## - WS.48 1 8.9241e+10 1.1914e+16 14946
## - FTr 1 3.1320e+11 1.1914e+16 14946
## - variosEquiposDummy 1 5.3321e+11 1.1914e+16 14946
## - OWS 1 1.7869e+12 1.1916e+16 14946
## - BPM 1 1.9095e+12 1.1916e+16 14946
## - BLK. 1 2.3257e+12 1.1916e+16 14946
## - DBPM 1 2.4219e+12 1.1916e+16 14946
## - DWS 1 3.3984e+12 1.1917e+16 14946
## - WS 1 3.7950e+12 1.1918e+16 14946
## - OBPM 1 3.9502e+12 1.1918e+16 14946
## - TS. 1 5.0209e+12 1.1919e+16 14946
## - AST. 1 5.3873e+12 1.1919e+16 14946
## - STL. 1 6.1502e+12 1.1920e+16 14946
## - nacionalidadDummy 1 1.3022e+13 1.1927e+16 14946
## - DRB. 1 2.4096e+13 1.1938e+16 14947
## - VORP 1 2.6991e+13 1.1941e+16 14947
## - TRB. 1 3.2593e+13 1.1946e+16 14947
## - PER 1 3.4665e+13 1.1949e+16 14947
## - ORB. 1 3.5574e+13 1.1949e+16 14948
## <none> 1.1914e+16 14948
## - X3PAr 1 5.4731e+13 1.1969e+16 14948
## - USG. 1 6.1221e+13 1.1975e+16 14948
## - NBA_DraftNumber 1 5.9205e+14 1.2506e+16 14969
## - MP 1 7.0844e+14 1.2622e+16 14974
## - G 1 1.0000e+15 1.2914e+16 14985
## - Age 1 2.1825e+15 1.4096e+16 15027
##
## Step: AIC=14946.01
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr +
## FTr + ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + OWS +
## DWS + WS + WS.48 + OBPM + DBPM + BPM + VORP + variosEquiposDummy +
## nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - WS.48 1 8.8406e+10 1.1914e+16 14944
## - FTr 1 3.1642e+11 1.1914e+16 14944
## - variosEquiposDummy 1 5.3214e+11 1.1914e+16 14944
## - OWS 1 1.7864e+12 1.1916e+16 14944
## - BPM 1 1.9389e+12 1.1916e+16 14944
## - DBPM 1 2.4487e+12 1.1916e+16 14944
## - BLK. 1 2.4684e+12 1.1916e+16 14944
## - DWS 1 3.4025e+12 1.1917e+16 14944
## - WS 1 3.7941e+12 1.1918e+16 14944
## - OBPM 1 4.0439e+12 1.1918e+16 14944
## - STL. 1 6.2918e+12 1.1920e+16 14944
## - AST. 1 6.4495e+12 1.1920e+16 14944
## - TS. 1 6.5197e+12 1.1920e+16 14944
## - nacionalidadDummy 1 1.3151e+13 1.1927e+16 14944
## - DRB. 1 2.4112e+13 1.1938e+16 14945
## - VORP 1 2.7916e+13 1.1942e+16 14945
## - TRB. 1 3.2595e+13 1.1946e+16 14945
## - PER 1 3.5070e+13 1.1949e+16 14945
## - ORB. 1 3.5580e+13 1.1949e+16 14946
## <none> 1.1914e+16 14946
## - X3PAr 1 5.7716e+13 1.1972e+16 14946
## - USG. 1 6.1283e+13 1.1975e+16 14946
## - NBA_DraftNumber 1 5.9377e+14 1.2508e+16 14968
## - MP 1 7.4077e+14 1.2655e+16 14973
## - G 1 1.0141e+15 1.2928e+16 14984
## - Age 1 2.2021e+15 1.4116e+16 15026
##
## Step: AIC=14944.02
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr +
## FTr + ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + OWS +
## DWS + WS + OBPM + DBPM + BPM + VORP + variosEquiposDummy +
## nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - FTr 1 2.6159e+11 1.1914e+16 14942
## - variosEquiposDummy 1 5.9846e+11 1.1915e+16 14942
## - OWS 1 1.7998e+12 1.1916e+16 14942
## - BPM 1 1.9294e+12 1.1916e+16 14942
## - BLK. 1 2.3820e+12 1.1916e+16 14942
## - DBPM 1 2.4359e+12 1.1916e+16 14942
## - DWS 1 3.3517e+12 1.1917e+16 14942
## - WS 1 3.8055e+12 1.1918e+16 14942
## - OBPM 1 4.0678e+12 1.1918e+16 14942
## - STL. 1 7.2532e+12 1.1921e+16 14942
## - TS. 1 8.8586e+12 1.1923e+16 14942
## - AST. 1 1.0136e+13 1.1924e+16 14942
## - nacionalidadDummy 1 1.3695e+13 1.1928e+16 14943
## - DRB. 1 2.4691e+13 1.1939e+16 14943
## - VORP 1 2.7843e+13 1.1942e+16 14943
## - TRB. 1 3.3217e+13 1.1947e+16 14943
## - ORB. 1 3.6693e+13 1.1951e+16 14944
## <none> 1.1914e+16 14944
## - PER 1 5.6921e+13 1.1971e+16 14944
## - X3PAr 1 5.9516e+13 1.1973e+16 14944
## - USG. 1 1.1803e+14 1.2032e+16 14947
## - NBA_DraftNumber 1 5.9936e+14 1.2513e+16 14966
## - MP 1 9.1792e+14 1.2832e+16 14978
## - G 1 1.0235e+15 1.2937e+16 14982
## - Age 1 2.2062e+15 1.4120e+16 15024
##
## Step: AIC=14942.03
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr +
## ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + OWS + DWS +
## WS + OBPM + DBPM + BPM + VORP + variosEquiposDummy + nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - variosEquiposDummy 1 5.9924e+11 1.1915e+16 14940
## - OWS 1 1.6987e+12 1.1916e+16 14940
## - BPM 1 1.9485e+12 1.1916e+16 14940
## - BLK. 1 2.3417e+12 1.1917e+16 14940
## - DBPM 1 2.4647e+12 1.1917e+16 14940
## - DWS 1 3.2238e+12 1.1917e+16 14940
## - WS 1 3.6650e+12 1.1918e+16 14940
## - OBPM 1 4.0901e+12 1.1918e+16 14940
## - STL. 1 7.2536e+12 1.1921e+16 14940
## - TS. 1 9.7660e+12 1.1924e+16 14940
## - AST. 1 1.0266e+13 1.1924e+16 14940
## - nacionalidadDummy 1 1.3953e+13 1.1928e+16 14941
## - DRB. 1 2.4688e+13 1.1939e+16 14941
## - VORP 1 2.7762e+13 1.1942e+16 14941
## - TRB. 1 3.3154e+13 1.1947e+16 14941
## - ORB. 1 3.6590e+13 1.1951e+16 14942
## <none> 1.1914e+16 14942
## - PER 1 5.6667e+13 1.1971e+16 14942
## - X3PAr 1 5.9872e+13 1.1974e+16 14942
## - USG. 1 1.1859e+14 1.2033e+16 14945
## - NBA_DraftNumber 1 6.1047e+14 1.2525e+16 14964
## - MP 1 9.1778e+14 1.2832e+16 14976
## - G 1 1.0336e+15 1.2948e+16 14980
## - Age 1 2.2176e+15 1.4132e+16 15022
##
## Step: AIC=14940.05
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr +
## ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + OWS + DWS +
## WS + OBPM + DBPM + BPM + VORP + nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - OWS 1 1.6830e+12 1.1917e+16 14938
## - BPM 1 1.9188e+12 1.1917e+16 14938
## - DBPM 1 2.4227e+12 1.1917e+16 14938
## - BLK. 1 2.4833e+12 1.1917e+16 14938
## - DWS 1 3.1729e+12 1.1918e+16 14938
## - WS 1 3.6356e+12 1.1918e+16 14938
## - OBPM 1 4.0632e+12 1.1919e+16 14938
## - STL. 1 7.2065e+12 1.1922e+16 14938
## - TS. 1 9.6123e+12 1.1924e+16 14938
## - AST. 1 1.0225e+13 1.1925e+16 14938
## - nacionalidadDummy 1 1.4330e+13 1.1929e+16 14939
## - DRB. 1 2.4715e+13 1.1940e+16 14939
## - VORP 1 2.8071e+13 1.1943e+16 14939
## - TRB. 1 3.3223e+13 1.1948e+16 14939
## - ORB. 1 3.6666e+13 1.1951e+16 14940
## <none> 1.1915e+16 14940
## - PER 1 5.7843e+13 1.1973e+16 14940
## - X3PAr 1 6.0657e+13 1.1975e+16 14940
## - USG. 1 1.1825e+14 1.2033e+16 14943
## - NBA_DraftNumber 1 6.0988e+14 1.2525e+16 14962
## - MP 1 9.1984e+14 1.2835e+16 14974
## - G 1 1.0382e+15 1.2953e+16 14978
## - Age 1 2.2230e+15 1.4138e+16 15021
##
## Step: AIC=14938.12
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr +
## ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + DWS + WS +
## OBPM + DBPM + BPM + VORP + nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - BPM 1 2.0886e+12 1.1919e+16 14936
## - DBPM 1 2.6009e+12 1.1919e+16 14936
## - BLK. 1 2.6993e+12 1.1919e+16 14936
## - OBPM 1 4.3221e+12 1.1921e+16 14936
## - STL. 1 6.5973e+12 1.1923e+16 14936
## - TS. 1 9.3397e+12 1.1926e+16 14936
## - AST. 1 1.0865e+13 1.1927e+16 14937
## - DWS 1 1.3018e+13 1.1930e+16 14937
## - nacionalidadDummy 1 1.4691e+13 1.1931e+16 14937
## - DRB. 1 2.4710e+13 1.1941e+16 14937
## - VORP 1 2.8829e+13 1.1945e+16 14937
## - TRB. 1 3.3269e+13 1.1950e+16 14938
## - ORB. 1 3.6745e+13 1.1953e+16 14938
## <none> 1.1917e+16 14938
## - PER 1 5.8763e+13 1.1975e+16 14938
## - X3PAr 1 6.0990e+13 1.1977e+16 14939
## - WS 1 6.6754e+13 1.1983e+16 14939
## - USG. 1 1.1913e+14 1.2036e+16 14941
## - NBA_DraftNumber 1 6.1650e+14 1.2533e+16 14960
## - MP 1 9.1824e+14 1.2835e+16 14972
## - G 1 1.0366e+15 1.2953e+16 14976
## - Age 1 2.2215e+15 1.4138e+16 15019
##
## Step: AIC=14936.2
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr +
## ORB. + DRB. + TRB. + AST. + STL. + BLK. + USG. + DWS + WS +
## OBPM + DBPM + VORP + nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - BLK. 1 2.4776e+12 1.1921e+16 14934
## - STL. 1 6.8228e+12 1.1925e+16 14934
## - DBPM 1 6.8629e+12 1.1925e+16 14934
## - TS. 1 8.9655e+12 1.1928e+16 14935
## - AST. 1 1.0674e+13 1.1929e+16 14935
## - DWS 1 1.2710e+13 1.1931e+16 14935
## - nacionalidadDummy 1 1.4682e+13 1.1933e+16 14935
## - DRB. 1 2.5619e+13 1.1944e+16 14935
## - VORP 1 2.8891e+13 1.1947e+16 14935
## - TRB. 1 3.4249e+13 1.1953e+16 14936
## - ORB. 1 3.7740e+13 1.1956e+16 14936
## <none> 1.1919e+16 14936
## - PER 1 5.7353e+13 1.1976e+16 14936
## - X3PAr 1 5.9432e+13 1.1978e+16 14937
## - OBPM 1 6.5340e+13 1.1984e+16 14937
## - WS 1 6.6133e+13 1.1985e+16 14937
## - USG. 1 1.1956e+14 1.2038e+16 14939
## - NBA_DraftNumber 1 6.2179e+14 1.2540e+16 14959
## - MP 1 9.1681e+14 1.2835e+16 14970
## - G 1 1.0348e+15 1.2953e+16 14974
## - Age 1 2.2297e+15 1.4148e+16 15017
##
## Step: AIC=14934.3
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + TS. + X3PAr +
## ORB. + DRB. + TRB. + AST. + STL. + USG. + DWS + WS + OBPM +
## DBPM + VORP + nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - TS. 1 7.8371e+12 1.1929e+16 14933
## - AST. 1 1.4225e+13 1.1935e+16 14933
## - nacionalidadDummy 1 1.4719e+13 1.1936e+16 14933
## - DWS 1 1.7119e+13 1.1938e+16 14933
## - STL. 1 1.8063e+13 1.1939e+16 14933
## - DBPM 1 2.6441e+13 1.1948e+16 14933
## - DRB. 1 2.7790e+13 1.1949e+16 14933
## - VORP 1 3.3346e+13 1.1954e+16 14934
## - TRB. 1 3.5638e+13 1.1957e+16 14934
## - ORB. 1 3.8618e+13 1.1960e+16 14934
## <none> 1.1921e+16 14934
## - WS 1 6.4336e+13 1.1985e+16 14935
## - X3PAr 1 6.4431e+13 1.1986e+16 14935
## - PER 1 8.0701e+13 1.2002e+16 14936
## - OBPM 1 9.1817e+13 1.2013e+16 14936
## - USG. 1 1.2226e+14 1.2043e+16 14937
## - NBA_DraftNumber 1 6.3424e+14 1.2555e+16 14957
## - MP 1 9.2302e+14 1.2844e+16 14968
## - G 1 1.0375e+15 1.2959e+16 14973
## - Age 1 2.2405e+15 1.4162e+16 15016
##
## Step: AIC=14932.62
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. +
## DRB. + TRB. + AST. + STL. + USG. + DWS + WS + OBPM + DBPM +
## VORP + nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - AST. 1 1.1112e+13 1.1940e+16 14931
## - STL. 1 1.4165e+13 1.1943e+16 14931
## - nacionalidadDummy 1 1.4456e+13 1.1943e+16 14931
## - DWS 1 1.6694e+13 1.1946e+16 14931
## - DRB. 1 2.5107e+13 1.1954e+16 14932
## - DBPM 1 2.5567e+13 1.1954e+16 14932
## - TRB. 1 3.2706e+13 1.1962e+16 14932
## - VORP 1 3.4003e+13 1.1963e+16 14932
## - ORB. 1 3.5532e+13 1.1964e+16 14932
## <none> 1.1929e+16 14933
## - X3PAr 1 5.7789e+13 1.1987e+16 14933
## - WS 1 6.2952e+13 1.1992e+16 14933
## - PER 1 8.3195e+13 1.2012e+16 14934
## - OBPM 1 8.4199e+13 1.2013e+16 14934
## - USG. 1 1.2730e+14 1.2056e+16 14936
## - NBA_DraftNumber 1 6.4275e+14 1.2572e+16 14956
## - MP 1 9.4035e+14 1.2869e+16 14967
## - G 1 1.0692e+15 1.2998e+16 14972
## - Age 1 2.2326e+15 1.4162e+16 15014
##
## Step: AIC=14931.07
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. +
## DRB. + TRB. + STL. + USG. + DWS + WS + OBPM + DBPM + VORP +
## nacionalidadDummy
##
## Df Sum of Sq RSS AIC
## - nacionalidadDummy 1 1.3729e+13 1.1954e+16 14930
## - STL. 1 1.4656e+13 1.1955e+16 14930
## - DWS 1 1.4716e+13 1.1955e+16 14930
## - DBPM 1 2.1751e+13 1.1962e+16 14930
## - DRB. 1 2.5650e+13 1.1966e+16 14930
## - VORP 1 2.6759e+13 1.1967e+16 14930
## - TRB. 1 3.3541e+13 1.1974e+16 14930
## - ORB. 1 3.5304e+13 1.1975e+16 14930
## - X3PAr 1 4.7634e+13 1.1988e+16 14931
## <none> 1.1940e+16 14931
## - WS 1 7.2427e+13 1.2012e+16 14932
## - PER 1 7.5762e+13 1.2016e+16 14932
## - OBPM 1 7.6140e+13 1.2016e+16 14932
## - USG. 1 1.1658e+14 1.2057e+16 14934
## - NBA_DraftNumber 1 6.4975e+14 1.2590e+16 14955
## - MP 1 9.3591e+14 1.2876e+16 14966
## - G 1 1.0780e+15 1.3018e+16 14971
## - Age 1 2.2236e+15 1.4164e+16 15012
##
## Step: AIC=14929.63
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. +
## DRB. + TRB. + STL. + USG. + DWS + WS + OBPM + DBPM + VORP
##
## Df Sum of Sq RSS AIC
## - DWS 1 1.3674e+13 1.1967e+16 14928
## - STL. 1 1.6114e+13 1.1970e+16 14928
## - DBPM 1 2.1136e+13 1.1975e+16 14928
## - VORP 1 2.6050e+13 1.1980e+16 14929
## - DRB. 1 2.6228e+13 1.1980e+16 14929
## - TRB. 1 3.4480e+13 1.1988e+16 14929
## - ORB. 1 3.6227e+13 1.1990e+16 14929
## - X3PAr 1 4.8211e+13 1.2002e+16 14930
## <none> 1.1954e+16 14930
## - WS 1 7.3809e+13 1.2028e+16 14931
## - PER 1 7.5833e+13 1.2030e+16 14931
## - OBPM 1 7.6710e+13 1.2030e+16 14931
## - USG. 1 1.1702e+14 1.2071e+16 14932
## - NBA_DraftNumber 1 6.4110e+14 1.2595e+16 14953
## - MP 1 9.2446e+14 1.2878e+16 14964
## - G 1 1.0656e+15 1.3019e+16 14969
## - Age 1 2.2142e+15 1.4168e+16 15010
##
## Step: AIC=14928.18
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. +
## DRB. + TRB. + STL. + USG. + WS + OBPM + DBPM + VORP
##
## Df Sum of Sq RSS AIC
## - DBPM 1 1.3054e+13 1.1980e+16 14927
## - STL. 1 1.3666e+13 1.1981e+16 14927
## - DRB. 1 2.0975e+13 1.1988e+16 14927
## - VORP 1 2.1716e+13 1.1989e+16 14927
## - TRB. 1 2.8572e+13 1.1996e+16 14927
## - ORB. 1 3.0256e+13 1.1998e+16 14927
## <none> 1.1967e+16 14928
## - X3PAr 1 6.1444e+13 1.2029e+16 14929
## - WS 1 6.6537e+13 1.2034e+16 14929
## - PER 1 9.3372e+13 1.2061e+16 14930
## - OBPM 1 9.6756e+13 1.2064e+16 14930
## - USG. 1 1.1213e+14 1.2080e+16 14931
## - NBA_DraftNumber 1 6.3970e+14 1.2607e+16 14951
## - MP 1 9.8628e+14 1.2954e+16 14964
## - G 1 1.0824e+15 1.3050e+16 14968
## - Age 1 2.2279e+15 1.4195e+16 15009
##
## Step: AIC=14926.7
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. +
## DRB. + TRB. + STL. + USG. + WS + OBPM + VORP
##
## Df Sum of Sq RSS AIC
## - STL. 1 3.5855e+12 1.1984e+16 14925
## - DRB. 1 2.3335e+13 1.2004e+16 14926
## - TRB. 1 3.2795e+13 1.2013e+16 14926
## - ORB. 1 3.5036e+13 1.2016e+16 14926
## - VORP 1 4.1953e+13 1.2022e+16 14926
## <none> 1.1980e+16 14927
## - WS 1 5.6198e+13 1.2037e+16 14927
## - X3PAr 1 7.7957e+13 1.2058e+16 14928
## - PER 1 8.9034e+13 1.2070e+16 14928
## - OBPM 1 9.2588e+13 1.2073e+16 14928
## - USG. 1 1.0474e+14 1.2085e+16 14929
## - NBA_DraftNumber 1 6.6016e+14 1.2641e+16 14951
## - MP 1 9.9212e+14 1.2973e+16 14963
## - G 1 1.1006e+15 1.3081e+16 14967
## - Age 1 2.2220e+15 1.4202e+16 15007
##
## Step: AIC=14924.85
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. +
## DRB. + TRB. + USG. + WS + OBPM + VORP
##
## Df Sum of Sq RSS AIC
## - DRB. 1 2.3150e+13 1.2007e+16 14924
## - TRB. 1 3.2841e+13 1.2017e+16 14924
## - ORB. 1 3.4831e+13 1.2019e+16 14924
## - VORP 1 3.8380e+13 1.2022e+16 14924
## <none> 1.1984e+16 14925
## - WS 1 6.4134e+13 1.2048e+16 14925
## - X3PAr 1 7.7528e+13 1.2062e+16 14926
## - PER 1 9.9444e+13 1.2084e+16 14927
## - OBPM 1 1.0195e+14 1.2086e+16 14927
## - USG. 1 1.1594e+14 1.2100e+16 14928
## - NBA_DraftNumber 1 6.5690e+14 1.2641e+16 14949
## - MP 1 9.8877e+14 1.2973e+16 14961
## - G 1 1.1071e+15 1.3091e+16 14966
## - Age 1 2.2380e+15 1.4222e+16 15006
##
## Step: AIC=14923.78
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. +
## TRB. + USG. + WS + OBPM + VORP
##
## Df Sum of Sq RSS AIC
## - VORP 1 3.5447e+13 1.2043e+16 14923
## <none> 1.2007e+16 14924
## - X3PAr 1 7.6377e+13 1.2084e+16 14925
## - WS 1 8.1813e+13 1.2089e+16 14925
## - PER 1 1.0378e+14 1.2111e+16 14926
## - OBPM 1 1.0573e+14 1.2113e+16 14926
## - ORB. 1 1.0859e+14 1.2116e+16 14926
## - USG. 1 1.1926e+14 1.2126e+16 14927
## - TRB. 1 2.3228e+14 1.2239e+16 14931
## - NBA_DraftNumber 1 6.6587e+14 1.2673e+16 14948
## - MP 1 9.6566e+14 1.2973e+16 14959
## - G 1 1.0977e+15 1.3105e+16 14964
## - Age 1 2.2414e+15 1.4249e+16 15004
##
## Step: AIC=14923.2
## Salary ~ NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. +
## TRB. + USG. + WS + OBPM
##
## Df Sum of Sq RSS AIC
## <none> 1.2043e+16 14923
## - X3PAr 1 8.1804e+13 1.2124e+16 14924
## - ORB. 1 1.2227e+14 1.2165e+16 14926
## - PER 1 1.3025e+14 1.2173e+16 14926
## - OBPM 1 1.3257e+14 1.2175e+16 14926
## - USG. 1 1.3897e+14 1.2182e+16 14927
## - TRB. 1 2.6687e+14 1.2310e+16 14932
## - NBA_DraftNumber 1 6.5783e+14 1.2700e+16 14947
## - WS 1 6.9027e+14 1.2733e+16 14948
## - MP 1 9.6191e+14 1.3005e+16 14958
## - G 1 1.3853e+15 1.3428e+16 14974
## - Age 1 2.2154e+15 1.4258e+16 15003
##
## Call:
## lm(formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER +
## X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nbaNumericas)
##
## Coefficients:
## (Intercept) NBA_DraftNumber Age G
## -3893333 -62168 511716 -159255
## MP PER X3PAr ORB.
## 5204 -320540 -3013992 -201694
## TRB. USG. WS OBPM
## 333889 130873 845245 550301
Con un AIC de 1492, el modelo obtenido mediante stepwise backward es el siguiente
modeloStepBack <- lm(
formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER +
X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nbaNumericas)
A continuación algunas medidas del modelo
summary(modeloStepBack)
##
## Call:
## lm(formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER +
## X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nbaNumericas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15532214 -3017494 -365840 2303991 21608017
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3893332.9 2785355.5 -1.398 0.16284
## NBA_DraftNumber -62168.3 12256.4 -5.072 5.66e-07 ***
## Age 511716.1 54973.9 9.308 < 2e-16 ***
## G -159255.3 21635.8 -7.361 8.21e-13 ***
## MP 5204.0 848.4 6.134 1.82e-09 ***
## PER -320540.0 142016.8 -2.257 0.02446 *
## X3PAr -3013991.7 1685020.0 -1.789 0.07431 .
## ORB. -201694.2 92231.2 -2.187 0.02925 *
## TRB. 333889.2 103347.8 3.231 0.00132 **
## USG. 130872.7 56136.5 2.331 0.02016 *
## WS 845245.2 162676.1 5.196 3.04e-07 ***
## OBPM 550301.3 241673.6 2.277 0.02323 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5057000 on 471 degrees of freedom
## Multiple R-squared: 0.5435, Adjusted R-squared: 0.5329
## F-statistic: 50.98 on 11 and 471 DF, p-value: < 2.2e-16
El modelo tiene un error estandar de la regresion bastane grande, y aunque la media de los resiudos no es demasiado elevada, la distribución de los mismos si lo es. Por ello, a continuación se realiza más ingenieria de variables, con el fin de mejorar la estimación
A continuación se secciona la variable draft en 6 grupos de unas 10 posiciones en cada grupo, con el objetivo de ver su influencia en el salari, y como puede afectar al modelo introducir una variable que contraste la pertenencia a cada grupo.
# Primero string encoding
# Se crea una nueva variable para cada intervalo de 10 drafteados
nba <- nba %>%
mutate(draft_group =
case_when(
NBA_DraftNumber >= 1 &
NBA_DraftNumber <= 10 ~ "[1-10]",
NBA_DraftNumber >= 11 &
NBA_DraftNumber <= 20 ~ "[11-20]",
NBA_DraftNumber >= 21 &
NBA_DraftNumber <= 30 ~ "[21-30]",
NBA_DraftNumber >= 31 &
NBA_DraftNumber <= 40 ~ "[31-40]",
NBA_DraftNumber >= 41 &
NBA_DraftNumber <= 50 ~ "[41-50]",
NBA_DraftNumber >= 51 ~ "[51-70]"))
# paso a factor
nba$draft_group <- as.factor(nba$draft_group)
# Grafico respecto a grupos
ggplotly(
ggplot(nba, aes(x = draft_group, y = Salary, fill = draft_group)) +
geom_boxplot() +
scale_y_log10() +
labs(title = "Salario vs. draft",
y = "Salario",
x = "Grupo de draft",
fill = NULL) +
theme_minimal()
)
# Diagramas de violin
ggplotly(
ggplot(nba, aes(x = draft_group, y = Salary, fill = draft_group)) +
geom_violin() +
scale_y_log10() +
labs(title = "Salario vs. draft",
y = "Salario",
x = "Grupo de draft",
fill = NULL) +
theme_minimal()
)
Se representan los salarios en escala logarítmica para poder apreciar mejor la tendencia. Existe una tendencia decreciente en los salarios medios y medianos a media que el grupo de draft es más alto, es decir, los que se han drafteado más tarde. No obstante, los salarios máximos no varían especialmente, y los mínimos bajan, aunque no es una tendencia constante. Los diagramas de violines muestran como el salario es mucho más disperso en el último grupo.
A continuación se genera la variable dummy para la pertenencia al grupo con salario más alto, el de los 10 primeros drafteados.
nba <- nba %>%
mutate(draftDummy = ifelse(draft_group == "[1-10]", 1, 0))
La variable MP recoge cuantos minutos ha jugado cada jugador a lo largo de la temporada. Examinando los datos, podemos ver que existen jugadores que han jugado menos de 82 minutos en la temporada, lo que equivaldríaa a jugar un minuto por partido.
# Listado de los de menos de 82
nba %>%
filter(MP < 82) %>%
dplyr::select(Player, Salary, MP) %>%
arrange(desc(Salary))
## Player Salary MP
## 1 Gordon Hayward 29727900 5
## 2 Joakim Noah 17765000 40
## 3 Luol Deng 17190000 13
## 4 Jeremy Lin 12000000 25
## 5 Cole Aldrich 7300000 46
## 6 Josh McRoberts 6021175 6
## 7 Alan Williams 6000000 70
## 8 Josh Smith 5400000 12
## 9 Kyle Singler 4666500 59
## 10 Mindaugas Kuzminskas 3025035 2
## 11 Udonis Haslem 2328652 72
## 12 Nick Collison 2328652 72
## 13 Justin Patton 2247480 4
## 14 D.J. Wilson 2135040 69
## 15 Wade Baldwin 1874400 29
## 16 Jeff Withey 1577320 39
## 17 Furkan Korkmaz 1465920 69
## 18 Tony Bradley 1414920 29
## 19 Okaro White 1312611 80
## 20 Nicolas Brussino 1312611 10
## 21 Kay Felder 1312611 3
## 22 Joel Bolomboy 1312611 38
## 23 Damian Jones 1312611 54
## 24 Ike Anigbogu 950000 28
## 25 Thomas Bryant 815615 34
## 26 Alfonzo McKinnie 815615 49
## 27 Jordan Crawford 250000 37
## 28 Larry Drew 148318 70
## 29 David Stockton 148318 6
## 30 Jeremy Evans 104059 5
## 31 Derrick Williams 104059 9
## 32 Marshall Plumlee 100000 52
## 33 Georges Niang 100000 18
## 34 Demetrius Jackson 92858 17
## 35 Nigel Hayes 92160 60
## 36 Naz Mitrou-Long 92160 1
## 37 MarShon Brooks 86119 76
## 38 Marquis Teague 83129 74
## 39 Jarell Eddie 83129 9
## 40 Xavier Silas 74159 7
## 41 Scotty Hopson 74159 8
## 42 Vince Hunter 50000 7
## 43 Vander Blue 50000 45
## 44 Nate Wolters 50000 19
## 45 Matt Williams 50000 11
## 46 Luis Montero 50000 8
## 47 James Michael McAdoo 50000 18
## 48 Jacob Pullen 50000 6
## 49 Gian Clavell 50000 64
## 50 Jameel Warney 46080 27
Vemos como pese ha jaber jugado tan poco, los salarios son abultados. Teniendo en cuenta que esta variable pertenece al modelo, es posible que estos datos estén dificultando el ajuste. En este contexto, se crea una variable que analice el salario por minutos jugados, con el fin de tener un criterio comparativo.
nba <- nba %>% mutate(
salarioPorMinuto = Salary / MP
)
mean(nba$salarioPorMinuto) # 33911.81 de media
## [1] 33911.81
summary(nba$salarioPorMinuto) # el maximo es muy abultado
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 127 1862 4545 33912 9389 5945580
Con esta variable, se vuelve a filtrar el dataset. El filtro incluye aquellos jugadores cuyo salario por minuto es tres veces superior a la media del salario por minuto del dataset
nba %>%
filter(salarioPorMinuto > (3*sd(salarioPorMinuto))) %>%
dplyr::select(Player, Salary, salarioPorMinuto, MP) %>%
arrange(desc(salarioPorMinuto))
## Player Salary salarioPorMinuto MP
## 1 Gordon Hayward 29727900 5945580 5
## 2 Mindaugas Kuzminskas 3025035 1512518 2
## 3 Luol Deng 17190000 1322308 13
## 4 Josh McRoberts 6021175 1003529 6
# Recojo estos nombres
nombresOutlier <- c("Gordon Hayward",
"Mindaugas Kuzminskas",
"Luol Deng",
"Josh McRoberts")
Con los nombres de esos jugadores, se filtra el dataset original, para eliminarlos.
nba <- nba[!nba$Player %in% nombresOutlier, ]
# seleccion de todos los que NO son
Finalmente, se vuelve a evaluar el modelo sobre estos datos, primero el modelo obtenido mediante Stepwise Backward, y luego este mismo modelo con la variable dummy del grupo del draft
# El modelo obtenido con step, pero sobre los datos retocados
modeloStepBack2 <- lm(
formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER +
X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nba)
# El mismo modelo, pero con la dummy de draft
modeloStepBackDraft <- lm(
formula = Salary ~ draftDummy + Age + G + MP + PER +
X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nba)
Aunque el primer modelo (StepBack2) es igual al anterior, se guarda con otro nombre, para poder compararlo y ver si ha servido de algo retocar los datos
AIC(modeloStepBack, modeloStepBack2, modeloStepBackDraft)
## df AIC
## modeloStepBack 13 16295.90
## modeloStepBack2 13 16140.82
## modeloStepBackDraft 13 16145.52
El modelo con mejor AIC es el segundo, es decir, el modelo sugerido por el Stewise Backward, pero evaluado sobre los datos retocados. Esto indica que la eliminación de esos datos ha mejorado el modelo. No obstante, es necesario recordar que es el modelo el que tiene que ajustarse a los datos, y no al reves.
summary(modeloStepBack2)
##
## Call:
## lm(formula = Salary ~ NBA_DraftNumber + Age + G + MP + PER +
## X3PAr + ORB. + TRB. + USG. + WS + OBPM, data = nba)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15483389 -2926541 -274616 2253041 20365505
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4180409.1 2739593.3 -1.526 0.12771
## NBA_DraftNumber -55517.5 12131.8 -4.576 6.08e-06 ***
## Age 501047.0 54025.7 9.274 < 2e-16 ***
## G -147921.2 21430.9 -6.902 1.68e-11 ***
## MP 5044.6 837.1 6.026 3.41e-09 ***
## PER -370908.5 140530.8 -2.639 0.00858 **
## X3PAr -3244205.1 1662338.1 -1.952 0.05158 .
## ORB. -171792.7 90891.8 -1.890 0.05937 .
## TRB. 337956.7 102924.4 3.284 0.00110 **
## USG. 162788.5 57951.4 2.809 0.00518 **
## WS 836548.4 161328.8 5.185 3.22e-07 ***
## OBPM 632390.9 238584.1 2.651 0.00831 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4951000 on 467 degrees of freedom
## Multiple R-squared: 0.555, Adjusted R-squared: 0.5445
## F-statistic: 52.95 on 11 and 467 DF, p-value: < 2.2e-16
El modelo sigue teniendo problemas de precisión, aunque se han reducido ligeramente.
Para probar el modelo final, se elige una muestra de los datos. Se fija una semilla con el valor 123 para posibilitar la reproductibilidad de la muestra
set.seed(123)
prediccion <- predict(modeloStepBack2,
# Muestra del 25% del dataset
sample_frac(nba, 0.25),
se.fit = TRUE)
# Con se.fit = TRUE se muestran los valores estimados
prediccion$residual.scale
## [1] 4950825
El error del modelo sobre la muestra sobre la que se predice es similar al obtenido en la evaluación del modelo sobre el dataset. No obstante, sigue habiendo un error muy elevado.
El modelo que mejor estima los salarios de los jugadores de la NBA es el siguiente:
\[ Salario = NBA_DraftNumber + Age + G + MP + PER + X3PAr + ORB. + TRB. + USG. + WS + OBPM \]
Con todo, el modelo deja bastante que desear en cuanto a capacidad predictiva y precision, pero no ha sido posible encontrar un modelo mejor. No obstante, se pone de manifiesto que mediante la ingeniería de variables es posible modificar la forma de los predictores del modelo, mejorando así su precisión. Estas ténicas permiten también introducir variables categóricas en el modelo, que pueden resultar enrriquecedoras en cuanto a la capacidad predictiva del mismo